﻿-------------------------------------------------------------------------------------------------------------
--------------------------------------------pca_caja.registros-----------------------------------------------
-------------------------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION pca_pagos.fn_add_registro
	(
		varchar,--empresa_id $1
		varchar,--oficina_id $2
		bigint,--grupo_movimiento_id $3
		bigint,--subgrupo_movimiento_id $54
		bigint,--sesion_id $5
		date,--fecha_emision $6
		date,--fecha_vencimiento $7
		date,--fecha_alerta $8
		varchar,--tipo_comprobante_id $9
		varchar,--strserienumero $10
		varchar,--usuario_registro_id $11
		varchar,--medio_pago_id $12
		varchar,--detalle $13
		varchar,--moneda_id $14
		numeric,--monto $15
		boolean,--cancelado $16
		timestamp with time zone --fecha_hora_cancelacion $17
	)RETURNS bigint AS
$$
BEGIN
	IF $16 = FALSE THEN
		$12 := NULL;
		$13 := NULL;
		$17 := NULL;
	END IF;

	INSERT INTO pca_pagos.registros
		(empresa_id,
		oficina_id,
		grupo_movimiento_id,
		subgrupo_movimiento_id,
		sesion_id,
		fecha_emision,
		fecha_vencimiento,
		fecha_alerta,
		tipo_comprobante_id,
		strserienumero,
		usuario_registro_id,
		medio_pago_id,
		detalle,
		moneda_id,
		monto,
		cancelado,
		fecha_hora_cancelacion) 
	VALUES
		($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17);

	RETURN  pca_global.fn_pseudo_encrypt_bigint(currval('pca_pagos.registro_id')::integer);
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_pagos.fn_update_registro
	(
		varchar,--empresa_id $1
		varchar,--oficina_id $2
		bigint,--registro_id $3
		bigint,--grupo_movimiento_id $4
		bigint,--subgrupo_movimiento_id $5
		bigint,--sesion_id $6
		date,--fecha_emision $7
		date,--fecha_vencimiento $8
		date,--fecha_alerta $9
		varchar,--tipo_comprobante_id $10
		varchar,--strserienumero $11
		varchar,--usuario_actualiza_id $12
		varchar,--moneda_id $13
		numeric --monto $14
	)RETURNS void AS
$$
BEGIN
	UPDATE pca_pagos.registros SET
		grupo_movimiento_id = $4,
		subgrupo_movimiento_id = $5,
		sesion_id = $6,
		fecha_emision = $7,
		fecha_vencimiento = $8,
		fecha_alerta = $9,
		tipo_comprobante_id = $10,
		strserienumero = $11,
		usuario_actualiza_id = $12,		
		moneda_id = $13,
		monto = $14
	WHERE
		empresa_id = $1 AND
		oficina_id = $2 AND
		registro_id = $3;
END
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_pagos.fn_pagar_registro
	(
		varchar,--empresa_id $1
		varchar,--oficina_id $2
		bigint,--registro_id $3
		varchar,--medio_pago_id $4
		varchar,--detalle $5
		timestamp with time zone --fecha_hora_cancelacion $6
	)RETURNS void AS
$$
BEGIN
	UPDATE pca_pagos.registros SET
		cancelado = true,
		medio_pago_id = $4,
		detalle = $5,
		fecha_hora_cancelacion = $6
	WHERE
		empresa_id = $1 AND
		oficina_id = $2 AND
		registro_id = $3;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_pagos.fn_cancelar_pago
	(
		varchar,--empresa_id $1
		varchar,--oficina_id $2
		bigint --registro_id $3
	)RETURNS void AS
$$
BEGIN
	UPDATE pca_pagos.registros SET
		cancelado = false,
		medio_pago_id = null,
		detalle = null,
		fecha_hora_cancelacion = null
	WHERE
		empresa_id = $1 AND
		oficina_id = $2 AND
		registro_id = $3;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_pagos.fn_del_registro
	(
		varchar,--empresa_id $1
		varchar,--oficina_id $2
		bigint --registro_id $3
	)RETURNS void AS
$$
BEGIN
	DELETE FROM pca_pagos.registros WHERE
		empresa_id = $1 AND
		oficina_id = $2 AND
		registro_id = $3;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_pagos.fn_get_registro
	(
		varchar,--empresa_id $1
		varchar,--oficina_id $2
		bigint --registro_id $3
	)RETURNS SETOF pca_pagos.vw_registros AS
$$
DECLARE
	_row pca_pagos.vw_registros%ROWTYPE;
BEGIN
	FOR _row IN
		SELECT
			*
		FROM
			pca_pagos.vw_registros
		WHERE
			empresa_id = $1 AND
			oficina_id = $2 AND
			registro_id = $3
	LOOP
		RETURN NEXT _row;
	END LOOP;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_pagos.fn_get_list_registros
	(
		integer,--start $1
		integer,--limit $2
		varchar,--empresa_id $3
		varchar,--oficina_id $4
		varchar --filtro $5
	)RETURNS SETOF refcursor AS
$$
DECLARE
	cursor_result refcursor;
	cursor_totalrows refcursor;
BEGIN
	OPEN cursor_result FOR
		SELECT
			*
		FROM
			pca_pagos.vw_registros
		WHERE
			empresa_id = $3 AND
			oficina_id = $4 AND
			lower(pca_global.fn_ascii(concat(detalle,strserienumero))) LIKE '%'|| lower(pca_global.fn_ascii($5)) ||'%'
		ORDER BY
			fecha_hora_sistema ASC LIMIT $2 OFFSET $1;
	RETURN NEXT cursor_result;

	OPEN cursor_totalrows FOR
		SELECT
			count(*)
		FROM
			pca_pagos.vw_registros
		WHERE
			empresa_id = $3 AND
			oficina_id = $4 AND
			lower(pca_global.fn_ascii(concat(detalle,strserienumero))) LIKE '%'|| lower(pca_global.fn_ascii($5)) ||'%';
	RETURN NEXT cursor_totalrows;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_pagos.fn_get_list_registros
	(
		integer,--start $1
		integer,--limit $2
		varchar,--empresa_id $3
		varchar,--oficina_id $4
		varchar,--filtro $5
		boolean --cancelado $6
	)RETURNS SETOF refcursor AS
$$
DECLARE
	cursor_result refcursor;
	cursor_totalrows refcursor;
BEGIN
	OPEN cursor_result FOR
		SELECT
			*
		FROM
			pca_pagos.vw_registros
		WHERE
			empresa_id = $3 AND
			oficina_id = $4 AND
			lower(pca_global.fn_ascii(concat(detalle,strserienumero))) LIKE '%'|| lower(pca_global.fn_ascii($5)) ||'%' AND
			cancelado = $6
		ORDER BY
			fecha_hora_sistema ASC LIMIT $2 OFFSET $1;
	RETURN NEXT cursor_result;

	OPEN cursor_totalrows FOR
		SELECT
			count(*)
		FROM
			pca_pagos.vw_registros
		WHERE
			empresa_id = $3 AND
			oficina_id = $4 AND
			lower(pca_global.fn_ascii(concat(detalle,strserienumero))) LIKE '%'|| lower(pca_global.fn_ascii($5)) ||'%' AND
			cancelado = $6;
	RETURN NEXT cursor_totalrows;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_pagos.fn_get_list_registros_vencidos
	(
		integer,--start $1
		integer,--limit $2
		varchar,--empresa_id $3
		varchar,--oficina_id $4
		varchar --filtro $5
	)RETURNS SETOF refcursor AS
$$
DECLARE
	cursor_result refcursor;
	cursor_totalrows refcursor;
BEGIN
	OPEN cursor_result FOR
		SELECT
			*
		FROM
			pca_pagos.vw_registros
		WHERE
			empresa_id = $3 AND
			oficina_id = $4 AND
			fecha_vencimiento < current_date AND
			cancelado = false AND
			lower(pca_global.fn_ascii(concat(detalle,strserienumero))) LIKE '%'|| lower(pca_global.fn_ascii($5)) ||'%'
		ORDER BY
			fecha_hora_sistema ASC LIMIT $2 OFFSET $1;
	RETURN NEXT cursor_result;

	OPEN cursor_totalrows FOR
		SELECT
			count(*)
		FROM
			pca_pagos.vw_registros
		WHERE
			empresa_id = $3 AND
			oficina_id = $4 AND
			fecha_vencimiento < current_date AND
			cancelado = false AND
			lower(pca_global.fn_ascii(concat(detalle,strserienumero))) LIKE '%'|| lower(pca_global.fn_ascii($5)) ||'%';
	RETURN NEXT cursor_totalrows;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_pagos.fn_get_count_vencidos_empresa
	(
		varchar --empresa_id $1
	)RETURNS bigint AS
$$
DECLARE
	resul bigint;
BEGIN
	SELECT
		count(*)
	INTO
		resul
	FROM
		pca_pagos.vw_registros
	WHERE
		empresa_id = $1 AND
		fecha_vencimiento < current_date AND
		cancelado = false;

	RETURN resul;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_pagos.fn_get_count_vencidos_oficina
	(
		varchar,--empresa_id $1
		varchar --oficina_id $2
	)RETURNS bigint AS
$$
DECLARE
	resul bigint;
BEGIN
	SELECT
		count(*)
	INTO
		resul
	FROM
		pca_pagos.vw_registros
	WHERE
		empresa_id = $1 AND
		oficina_id = $2 AND
		fecha_vencimiento < current_date AND
		cancelado = false;

	RETURN resul;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_pagos.fn_get_count_pendientes_empresa
	(
		varchar --empresa_id $1
	)RETURNS bigint AS
$$
DECLARE
	resul bigint;
BEGIN
	SELECT
		count(*)
	INTO
		resul
	FROM
		pca_pagos.vw_registros
	WHERE
		empresa_id = $1 AND
		cancelado = false AND
		current_date BETWEEN fecha_alerta AND fecha_vencimiento;

	RETURN resul;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_pagos.fn_get_count_pendientes_oficina
	(
		varchar,--empresa_id $1
		varchar --oficina_id $2
	)RETURNS bigint AS
$$
DECLARE
	resul bigint;
BEGIN
	SELECT
		count(*)
	INTO
		resul
	FROM
		pca_pagos.vw_registros
	WHERE
		empresa_id = $1 AND
		oficina_id = $2 AND
		cancelado = false AND
		current_date BETWEEN fecha_alerta AND fecha_vencimiento;

	RETURN resul;
END;
$$
LANGUAGE plpgsql;